﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CROSLAND.BL.BE;
using CroslandSAP.Proxy;
using System.Data;

namespace CROSLAND.DL.DALC.SAPC
{
    public class StockDALC : IStockDALC
    {
        public static StockDALC Instance()
        {
            if (_instance == null)
            {
                lock (typeof(StockDALC))
                {
                    if (_instance == null)
                    {
                        _instance = new StockDALC();
                    }
                }
            }
            return _instance;
        }

        private StockDALC() { }
        private static volatile StockDALC _instance = null;

        #region IStockDALC Members

        public List<ReservaBE> buscarStockVMS(string pCodMaterial, string pColor, string pCentro, string pAlmacen, string pLote, string pJerarquia, string pGrart, string pAñoFab, string pDisponibilidad)
        {
            StockProxy proxy = new StockProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            RANGE_MATNRTable ranCodMat = new RANGE_MATNRTable();
            RANGE_MATNR lineCodMat = new RANGE_MATNR();
            if (!string.IsNullOrEmpty(pCodMaterial))
            {
                lineCodMat.Sign = "I";
                lineCodMat.Option0 = "EQ";
                lineCodMat.Low = pCodMaterial;
                ranCodMat.Add(lineCodMat);
            }

            ZRANGE_ZZCOLORTable ranColor = new ZRANGE_ZZCOLORTable();
            ZRANGE_ZZCOLOR lineColor = new ZRANGE_ZZCOLOR();
            if (!string.IsNullOrEmpty(pColor))
            {
                lineColor.Sign = "I";
                lineColor.Option0 = "EQ";
                lineColor.Low = pColor;
                ranColor.Add(lineColor);
            }

            RANGE_WERKSTable ranCentro = new RANGE_WERKSTable();
            RANGE_WERKS lineCentro = new RANGE_WERKS();
            if (!string.IsNullOrEmpty(pCentro))
            {
                lineCentro.Sign = "I";
                lineCentro.Option0 = "EQ";
                lineCentro.Low = pCentro;
                ranCentro.Add(lineCentro);
            }

            BAPIDLV_RANGE_LGORTTable ranAlmacen = new BAPIDLV_RANGE_LGORTTable();
            BAPIDLV_RANGE_LGORT lineAlmacen = new BAPIDLV_RANGE_LGORT();
            if (!string.IsNullOrEmpty(pAlmacen))
            {
                lineAlmacen.Sign = "I";
                lineAlmacen.Option0 = "EQ";
                lineAlmacen.Stge_Loc_Low = pAlmacen;
                ranAlmacen.Add(lineAlmacen);
            }

            BAPIDLV_RANGE_CHARGTable ranLote = new BAPIDLV_RANGE_CHARGTable();
            BAPIDLV_RANGE_CHARG lineLote = new BAPIDLV_RANGE_CHARG();
            if (!string.IsNullOrEmpty(pLote))
            {
                lineLote.Sign = "I";
                lineLote.Option0 = "EQ";
                lineLote.Batch_Low = pLote;
                ranLote.Add(lineLote);
            }

            ZRANGE_PRDHATable ranJerarquia = new ZRANGE_PRDHATable();
            ZRANGE_PRDHA lineJerarquia = new ZRANGE_PRDHA();
            if (!string.IsNullOrEmpty(pJerarquia))
            {
                lineJerarquia.Sign = "I";
                lineJerarquia.Option0 = "CP";
                lineJerarquia.Low = pJerarquia;
                ranJerarquia.Add(lineJerarquia);
            }

            BAPIDLV_RANGE_MATKLTable ranGrpArticulo = new BAPIDLV_RANGE_MATKLTable();
            BAPIDLV_RANGE_MATKL lineGrpArticulo = new BAPIDLV_RANGE_MATKL();
            if (!string.IsNullOrEmpty(pGrart))
            {
                lineGrpArticulo.Sign = "I";
                lineGrpArticulo.Option0 = "EQ";
                lineGrpArticulo.Matl_Group_Low = pGrart;
                ranGrpArticulo.Add(lineGrpArticulo);
            }

            ZRANGE_ZZANOFABTable ranAñoFab = new ZRANGE_ZZANOFABTable();
            ZRANGE_ZZANOFAB lineAñoFab = new ZRANGE_ZZANOFAB();
            if (!string.IsNullOrEmpty(pAñoFab))
            {
                lineAñoFab.Sign = "I";
                lineAñoFab.Option0 = "EQ";
                lineAñoFab.Low = pAñoFab;
                ranAñoFab.Add(lineAñoFab);
            }

            ZRANGE_AVAILTable ranDisponibilidad = new ZRANGE_AVAILTable();
            ZRANGE_AVAIL lineDisponibilidad = new ZRANGE_AVAIL();
            if (!string.IsNullOrEmpty(pDisponibilidad))
            {
                lineDisponibilidad.Sign = "I";
                lineDisponibilidad.Option0 = "EQ";
                lineDisponibilidad.Low = pDisponibilidad;
                ranDisponibilidad.Add(lineDisponibilidad);
            }

            ZSVMS_STOCKTable tblStock = new ZSVMS_STOCKTable();

            proxy.Zvms_Get_Stock(ref ranAñoFab, ref ranDisponibilidad, ref ranLote, ref ranColor, ref ranJerarquia, ref ranAlmacen, ref ranGrpArticulo, ref ranCodMat, ref ranCentro, ref tblStock);
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;
            /* Manejando el retorno */
            DataTable dt = tblStock.ToADODataTable();
            ReservaBE objReserva = new ReservaBE();
            List<ReservaBE> lsReserva = new List<ReservaBE>();
            string msj = "";
            foreach (ZSVMS_STOCK itm in tblStock)
            {
                try
                {
                    msj = itm.Zlote;
                    objReserva = new ReservaBE();
                    objReserva.codMaterial = itm.Zmaterial;
                    objReserva.descMaterial = itm.Zdesc_Material;
                    objReserva.lote = itm.Zlote;
                    objReserva.añoFab = itm.Zano_Fab;
                    objReserva.añoModelo = itm.Zano_Modelo;
                    objReserva.campaña = itm.Zcampana;
                    objReserva.color = itm.Zcolor;
                    objReserva.descColor = itm.Zdesc_Color;
                    objReserva.descCentro = itm.Zdesc_Centro;
                    objReserva.descAlmacen = itm.Zdesc_Almacen;
                    objReserva.cantidad = string.IsNullOrEmpty(itm.Zcantidad.ToString()) ? 0m : Convert.ToDecimal(itm.Zcantidad);
                    objReserva.disponibilidad = itm.Zdisponibilidad;
                    objReserva.descCliente = itm.Zdesc_Solic;
                    if (itm.Zfec_Venc == "00000000")
                    {
                        objReserva.fecVencimiento = null;
                    }
                    else
                    {
                        objReserva.fecVencimiento = ParametroDALC.dateSapToNet(itm.Zfec_Venc);
                    }
                    if (itm.Zfec_Nac_Real == "00000000")
                    {
                        objReserva.fecNacionalizacion = null;
                    }
                    else
                    {
                        objReserva.fecNacionalizacion = ParametroDALC.dateSapToNet(itm.Zfec_Nac_Real);
                    }
                    objReserva.emplazamiento = itm.Zemplazamiento;
                    objReserva.codstatus = itm.Zcodstatus;
                    objReserva.status = itm.Zstatus;
                    objReserva.chasis = itm.Zchasis;
                    objReserva.motor = itm.Zmotor;
                    objReserva.caja = string.IsNullOrEmpty(itm.Zcaja.ToString()) ? 0m : Convert.ToDecimal(itm.Zcaja);
                    objReserva.pedidoImportacion = itm.Zpedidoimp;
                    objReserva.marca = itm.Zmarca;
                    objReserva.modelo = itm.Zmodelo;
                    objReserva.grupoArticulo = itm.Zgrupo_Articulo;
                    lsReserva.Add(objReserva);
                }
                catch(Exception ex)
                {
                    Console.Write(msj);
                }
            }
            return lsReserva;
        }

        public List<string> GenerarReserva(DateTime fechaInicio, DateTime fechaFin, string orgVtas, string canal, string codCliente, string oficina, List<string> lstLote, List<GenericBE> lstStatus)
        {
            StockProxy proxy = new StockProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            ZTTZSVMS_STOCK listaLote = new ZTTZSVMS_STOCK();
            ZSVMS_STOCK itemLote = new ZSVMS_STOCK();
            VLCACTDATA data = new VLCACTDATA();
            VLCACTDATA_ITEM_T pos = new VLCACTDATA_ITEM_T();
            VLCACTDATA_ITEM_S linePos = new VLCACTDATA_ITEM_S();
            string pFechaInicio = dateNetToSap(fechaInicio);
            string pFechaFin = dateNetToSap(fechaFin);

            foreach (string itm in lstLote)
            {
                itemLote = new ZSVMS_STOCK();
                itemLote.Zlote = itm;
                listaLote.Add(itemLote);
                linePos = new VLCACTDATA_ITEM_S();
                linePos.Vhcle = itm;
                linePos.Resdatfrom = pFechaInicio;
                linePos.Resdatto = pFechaFin;
                pos.Add(linePos);
            }

            data.Actdata_Item = pos;
            data.Vkorg = orgVtas;
            data.Vtweg = canal;
            data.Kunnr = codCliente;
            data.Zzvkbur = oficina;

            WSAO_BAPI6032_RETURN_TAB tblRet = new WSAO_BAPI6032_RETURN_TAB();
            DYCBOXTable dy = new DYCBOXTable();

            DYCBOXTable lstSta = new DYCBOXTable();
            DYCBOX sta;

            foreach (GenericBE itm in lstStatus)
            {
                sta = new DYCBOX();
                sta.Fieldname = itm.Codigo;
                sta.Helpid = itm.Descripcion;
                lstSta.Add(sta);
            }

            proxy.Zvmc_Sd_017(data, pFechaFin, pFechaInicio, listaLote, out tblRet, ref dy, ref lstSta);
            //proxy.Zvmc_Sd_017(data, pFechaFin, pFechaInicio, listaLote, out result);
            
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;

            DataTable dt = tblRet.ToADODataTable();
            List<string> listaResult = new List<string>();
            foreach (DataRow dr in dt.Rows)
            {
                string st = dr["message"].ToString();
                listaResult.Add(st);
            }
            return listaResult;
        }

        #region Asignar Campañas

        public List<string> AsignarCampana(List<string> lstLote, List<GenericBE> lstStatus, string pCamp, UsuarioWebBE uw)
        {
            StockProxy proxy = new StockProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            ZTTZSVMS_STOCK listaLote = new ZTTZSVMS_STOCK();
            ZSVMS_STOCK itemLote = new ZSVMS_STOCK();
            VLCACTDATA data = new VLCACTDATA();

            foreach (string itm in lstLote)
            {
                itemLote = new ZSVMS_STOCK();
                itemLote.Zlote = itm;
                listaLote.Add(itemLote);
            }

            DYCBOXTable lstSta = new DYCBOXTable();
            DYCBOX sta;

            foreach (GenericBE itm in lstStatus)
            {
                sta = new DYCBOX();
                sta.Fieldname = itm.Codigo;
                sta.Helpid = itm.Descripcion;
                lstSta.Add(sta);
            }

            data.Cmpgn = pCamp;
            data.Vkorg = uw.OrgVentas;
            data.Vtweg = uw.CanalDist;
            DYCBOXTable dy = new DYCBOXTable();
            proxy.Zvmc_Sd_004(data, listaLote, ref dy, ref lstSta);

            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;

            DataTable dt = dy.ToADODataTable();
            List<string> listaResult = new List<string>();
            foreach (DataRow dr in dt.Rows)
            {
                string st = dr["HELPID"].ToString();
                listaResult.Add(st);
            }
            return listaResult;
        }

        #endregion

        public static string dateNetToSap(DateTime pFechaNET)
        {
            try
            {
                return pFechaNET.Year.ToString().PadLeft(4, '0') + pFechaNET.Month.ToString().PadLeft(2, '0') + pFechaNET.Day.ToString().PadLeft(2, '0');
            }
            catch { return string.Empty; }
        }
        
        public List<StockBE> buscarStock(StockBE pObjStock)
        {
            List<StockBE> listaResult = new List<StockBE>();
            return listaResult;
        }

        public List<StockBE> buscarStockEC(StockBE pObjStock)
        {
            List<StockBE> listaResult = new List<StockBE>();
            return listaResult;
        }

        #endregion
    }
}
